GEMI is a vegetation-oriented spectral index designed to reduce atmospheric and soil background
effects, making it suitable for large-scale environmental monitoring over wide regions.
1. Scientific Definition
The Global Environmental Monitoring Index (GEMI) is a nonlinear spectral index
that combines Red and Near-InfraRed (NIR) reflectance to monitor vegetation while being
less sensitive to atmospheric effects and soil background than simple indices such as NDVI.
Formula
GEMI is usually computed in two steps:
η = (2(NIR² − Red²) + 1.5·NIR + 0.5·Red) / (NIR + Red + 0.5)
GEMI = η · (1 − 0.25·η) − (Red − 0.125) / (1 − Red)
Dimensionless (≈ −1 to +1)
NIR and Red are surface reflectance values (0–1). GEMI behaves
similarly to NDVI in highlighting vegetation, but with reduced sensitivity to atmospheric
variations and soil background.
Typical Interpretation
GEMI Range
Interpretation
< 0.0
Water, clouds, snow, or non-vegetated bright surfaces
0.0 – 0.2
Bare soil, rocks, built-up, or very sparse vegetation
Dense and healthy vegetation (croplands, forests with high biomass)
Key Applications
Global and regional vegetation monitoring
Environmental change detection and land degradation studies
Large-scale land cover / land use assessments
Complementary analysis to NDVI in areas with strong soil/background influence
2. Data & Bands for GEMI
Common Sensors & Bands
Sentinel-2 (ESA) – 10 m
Red: B4 (~665 nm)
NIR: B8 (~842 nm)
Landsat 8/9 OLI – 30 m
Red: B4
NIR: B5
Good Practice
Use atmospherically corrected surface reflectance products (e.g. COPERNICUS/S2_SR).
Filter images by date range and cloud percentage (e.g. < 20–30%).
Mask clouds and cloud shadows using the QA bands or cloud probability bands when available.
Clip the final GEMI raster to your Area of Interest (AOI) before exporting.
Palette Suggestion
A GEMI color palette similar to NDVI:
[ "#440154", "#3b528b", "#21908c", "#5dc963", "#fde725" ]
3. Google Earth Engine Code – GEMI (Sentinel-2)
This script computes GEMI from Sentinel-2 surface reflectance for any drawn AOI.
Steps: draw your geometry in the Code Editor, set date range, run, then export GEMI as GeoTIFF.
// -------------------------------------------------------
// GEMI – Global Environmental Monitoring Index (Sentinel-2)
// Start4IT – GIS & Remote Sensing
// -------------------------------------------------------
// 1. Define Area of Interest (AOI)
// Draw a polygon/rectangle in the Code Editor and rename it to "geometry"
var roi = geometry;
// 2. Define date range
var startDate = '2023-01-01';
var endDate = '2023-12-31';
// 3. Load Sentinel-2 Surface Reflectance collection
var s2 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.select(['B4', 'B8']); // Red, NIR
// 4. Create a median composite and clip to AOI
var image = s2.median().clip(roi);
// 5. Compute GEMI
// Step 1: compute η (eta)
var eta = image.expression(
'(2.0 * (NIR * NIR - RED * RED) + 1.5 * NIR + 0.5 * RED) / (NIR + RED + 0.5)',
{
'NIR': image.select('B8'),
'RED': image.select('B4')
}
);
// Step 2: compute GEMI
var gemi = image.expression(
'ETA * (1.0 - 0.25 * ETA) - (RED - 0.125) / (1.0 - RED)',
{
'ETA': eta,
'RED': image.select('B4')
}
).rename('GEMI');
// 6. Visualization
var gemiVis = {
min: -1,
max: 1,
palette: [
'#440154', // low
'#3b528b',
'#21908c',
'#5dc963',
'#fde725' // high
]
};
// 7. Add layers to the map
Map.centerObject(roi, 10);
Map.addLayer(gemi, gemiVis, 'GEMI (Sentinel-2)', true);
// Optional: true color composite for context
var s2_rgb = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.select(['B4', 'B3', 'B2']) // RGB
.median()
.clip(roi);
Map.addLayer(s2_rgb, {min: 0, max: 3000}, 'True Color (RGB)', false);
// 8. Export GEMI as GeoTIFF to Google Drive
Export.image.toDrive({
image: gemi,
description: 'GEMI_Export',
fileNamePrefix: 'GEMI_Export',
region: roi,
scale: 10, // 10 m for Sentinel-2 B8/B4
crs: 'EPSG:4326',
maxPixels: 1e13
});
// End of script